﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Resources;
using System.Web;
using vudu.Logica.Clases;

namespace vudu.EnlaceDatos.SqlServer
{
    public class SqlServerEstudiante
    {
        #region Atributos

        Conexion _miConexion;

        #endregion

        #region Constructor

        /// <summary>
        /// Constructor de la clase SqlServerEstudiante
        /// </summary>
        public SqlServerEstudiante()
        {
            _miConexion = new Conexion();
        }

        #endregion

        #region Metodos

        /// <summary>
        /// Metodo que consulta todos los estudiantes 
        /// </summary>
        /// <returns> Retorna una lista de estudiante </returns>
        public List<Estudiante> ConsultarTodosLosEstudiante()
        {
            List<Estudiante> lista = new List<Estudiante>(); // declaracion de la lista de estadiante

            SqlCommand command = new SqlCommand();

            _miConexion.AbrirConexionBd();
            command.Connection = _miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[SELestudiante]"; // nombre del storedProcedure
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Estudiante est = new Estudiante(); // se inicializa el objeto estudiante
                est.IdEst = reader.GetInt32(0);
                est.Expediente = reader["noExpediente"].ToString();
                est.Cedula = reader.GetInt32(2);
                est.Nombre = reader["nombre"].ToString();
                est.Apellido = reader["apellido"].ToString();
                est.FechaNacimiento = reader.GetDateTime(5);
                est.Sexo = reader["sexo"].ToString();
                est.Telefono = reader["telefono"].ToString();
                est.Correo = reader["correo"].ToString();

                lista.Add(est); // Se agrega cada estudiante a la lista
            }
            reader.Close();
            _miConexion.CerrarConexionBd();
            return lista;
        }

        /// <summary>
        ///  Metodo para consultar un estudiante por cedula de identidad
        /// </summary>
        /// <param name="ci"> Cedula de identidad del estudiante </param>
        /// <returns> Retorna el objeto estudiante </returns>
        public Estudiante ConsultarUnEstudiante(int ci)
        {
            SqlCommand command = new SqlCommand();
            Estudiante miEstudiante = new Estudiante(); /// objeto estudiante
            try
            {
                _miConexion.AbrirConexionBd();
                command.Connection = _miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarUnEstudiante]"; /// stored procedure
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@ciEstudiante", ci); /// se realiza la consulta por el numero de cedula

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())   /// se cargan todos los datos del estudiante
                {
                    miEstudiante.IdEst = reader.GetInt32(0);
                    miEstudiante.Expediente = reader["noExpediente"].ToString();
                    miEstudiante.Cedula = reader.GetInt32(2);
                    miEstudiante.Nombre = reader["nombre"].ToString();
                    miEstudiante.Apellido = reader["apellido"].ToString();
                    miEstudiante.FechaNacimiento = reader.GetDateTime(5);
                    miEstudiante.Sexo = reader["sexo"].ToString();
                    miEstudiante.Telefono = reader["telefono"].ToString();
                    miEstudiante.Correo = reader["correo"].ToString();
                }
                reader.Close();
                _miConexion.CerrarConexionBd();
            }
            catch (SqlException)
            {
                miEstudiante = null;
            }
            catch (NullReferenceException)
            {
                miEstudiante = null;
            }
            catch (Exception)
            {
                miEstudiante = null;
            }
            finally
            {
                _miConexion.CerrarConexionBd();
            }
            return miEstudiante;
        }

        public int ConsultarEstudianteExistente(int ci)
        {
            SqlCommand command = new SqlCommand();
            Estudiante miEstudiante = new Estudiante(); /// objeto estudiante

            _miConexion.AbrirConexionBd();
            command.Connection = _miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[SELestudianteCed]"; /// stored procedure
            command.CommandTimeout = 10;
            command.Parameters.AddWithValue("@ced", ci);

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())   /// se cargan todos los datos del estudiante
            {
                miEstudiante.IdEst = reader.GetInt32(0);
                miEstudiante.Expediente = reader["noExpediente"].ToString();
                miEstudiante.Cedula = reader.GetInt32(2);
                miEstudiante.Nombre = reader["nombre"].ToString();
                miEstudiante.Apellido = reader["apellido"].ToString();
                miEstudiante.FechaNacimiento = reader.GetDateTime(5);
                miEstudiante.Sexo = reader["sexo"].ToString();
                miEstudiante.Telefono = reader["telefono"].ToString();
                miEstudiante.Correo = reader["correo"].ToString();
            }
            reader.Close();
            _miConexion.CerrarConexionBd();

            return miEstudiante.Cedula;
        }

        public Estudiante ConsultarEstudianteCedula(int ci)
        {
            SqlCommand command = new SqlCommand();
            Estudiante miEstudiante = new Estudiante(); /// objeto estudiante

            _miConexion.AbrirConexionBd();
            command.Connection = _miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[SELestudianteCed]"; /// stored procedure
            command.CommandTimeout = 10;
            command.Parameters.AddWithValue("@ced", ci);

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())   /// se cargan todos los datos del estudiante
            {
                miEstudiante.IdEst = reader.GetInt32(0);
                miEstudiante.Expediente = reader["noExpediente"].ToString();
                miEstudiante.Cedula = reader.GetInt32(2);
                miEstudiante.Nombre = reader["nombre"].ToString();
                miEstudiante.Apellido = reader["apellido"].ToString();
                miEstudiante.FechaNacimiento = reader.GetDateTime(5);
                miEstudiante.Sexo = reader["sexo"].ToString();
                miEstudiante.Telefono = reader["telefono"].ToString();
                miEstudiante.Correo = reader["correo"].ToString();
            }
            reader.Close();
            _miConexion.CerrarConexionBd();

            return miEstudiante;
        }

        public Estudiante ConsultarEstudianteExpe(string expe)
        {
            SqlCommand command = new SqlCommand();
            Estudiante miEstudiante = new Estudiante(); /// objeto estudiante

            _miConexion.AbrirConexionBd();
            command.Connection = _miConexion.ObjetoConexion();
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "[dbo].[SELestudianteExp]"; /// stored procedure
            command.CommandTimeout = 10;
            command.Parameters.AddWithValue("@expe", expe);

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())   /// se cargan todos los datos del estudiante
            {
                miEstudiante.IdEst = reader.GetInt32(0);
                miEstudiante.Expediente = reader["noExpediente"].ToString();
                miEstudiante.Cedula = reader.GetInt32(2);
                miEstudiante.Nombre = reader["nombre"].ToString();
                miEstudiante.Apellido = reader["apellido"].ToString();
                miEstudiante.FechaNacimiento = reader.GetDateTime(5);
                miEstudiante.Sexo = reader["sexo"].ToString();
                miEstudiante.Telefono = reader["telefono"].ToString();
                miEstudiante.Correo = reader["correo"].ToString();
            }
            reader.Close();
            _miConexion.CerrarConexionBd();

            return miEstudiante;
        }

        public int InsertarEstudiante(Estudiante est)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELinsertarEstudiante]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@noExpediente", est.Expediente);
                command.Parameters.AddWithValue("@cedula", est.Cedula);
                command.Parameters.AddWithValue("@nombre", est.Nombre);
                command.Parameters.AddWithValue("@apellido", est.Apellido);
                command.Parameters.AddWithValue("@fechanac", est.FechaNacimiento);
                command.Parameters.AddWithValue("@sexo", est.Sexo);
                command.Parameters.AddWithValue("@telefono", est.Telefono);
                command.Parameters.AddWithValue("@correo", est.Correo);
                command.Parameters.AddWithValue("@idInsertado", SqlDbType.Int);

                command.Parameters["@noExpediente"].Direction = ParameterDirection.Input;
                command.Parameters["@cedula"].Direction = ParameterDirection.Input;
                command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@apellido"].Direction = ParameterDirection.Input;
                command.Parameters["@fechanac"].Direction = ParameterDirection.Input;
                command.Parameters["@sexo"].Direction = ParameterDirection.Input;
                command.Parameters["@telefono"].Direction = ParameterDirection.Input;
                command.Parameters["@correo"].Direction = ParameterDirection.Input;
                command.Parameters["@idInsertado"].Direction = ParameterDirection.Output;

                //se ejecuta el comando
                command.ExecuteReader();
                //se lee la variable de tipo output para saber que id fue insertado en base de datos.
                int idInsertado = (int)command.Parameters["@idInsertado"].Value;

                return idInsertado;
            }
            catch (Exception e)
            {
                throw new Exception("Error en la conexion");
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }

        public int InsertarEstudianteEscuela(int idestudiante, int idescuela, DateTime fecha)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELinsertarEstEsc]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@fkescuela", idescuela);
                command.Parameters.AddWithValue("@fkestudiante", idestudiante);
                command.Parameters.AddWithValue("@fechainicio", fecha);
                
                command.Parameters.AddWithValue("@idInsertado", SqlDbType.Int);

                command.Parameters["@fkescuela"].Direction = ParameterDirection.Input;
                command.Parameters["@fkestudiante"].Direction = ParameterDirection.Input;
                command.Parameters["@fechainicio"].Direction = ParameterDirection.Input;
                
                command.Parameters["@idInsertado"].Direction = ParameterDirection.Output;

                //se ejecuta el comando
                command.ExecuteReader();
                //se lee la variable de tipo output para saber que id fue insertado en base de datos.
                int idInsertado = (int)command.Parameters["@idInsertado"].Value;

                return idInsertado;
            }
            catch (Exception e)
            {
                throw new Exception("Error en la conexion");
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion Metodos
    }
}